IF EXISTS (SELECT * FROM sys.objects WHERE object_id=OBJECT_ID(N'[dbo].[sp_PageIndex]')AND type IN (N'P', N'PC'))
	DROP PROCEDURE [dbo].[sp_PageIndex];
GO

SET ANSI_NULLS ON;
GO

SET QUOTED_IDENTIFIER ON;
GO
CREATE PROCEDURE [dbo].[sp_PageIndex]( @sqlSelect varchar(800) --SELECT 后面 FROM 前面 的 字段 不用包含SELECT
,@sqlFrom varchar(800) --FROM 后面 的 字段 包含FROM
,@countPerPage int -- 每页数据行数
,@toPage int --要转到的页码
)
AS
BEGIN

-- 根据每页数据行数 和 要转到的页码 得到 数据起止点
Declare @start int
Declare @end int
 
set @end = @countPerPage * @toPage
set @start = @countPerPage * (@toPage - 1) + 1
 
 
-- 临时表名称 可随机命名
Declare @tmpTable varchar(10)
SET @tmpTable ='#tmp'
 
Declare @sqlStr varchar(800)
-- 创建数据源到临时表
SELECT @sqlStr = 'SELECT Identity(int,1,1) AS RowIndex,'
SELECT @sqlStr = @sqlStr + rtrim(@sqlSelect) + ' INTO  '+ @tmpTable 
SELECT @sqlStr = @sqlStr + rtrim(@sqlFrom) 
-- 查询临时表 得到所需要的数据
SELECT @sqlStr = @sqlStr + ' '+' SELECT '+ rtrim(@sqlSelect) +' FROM ' + @tmpTable 
SELECT @sqlStr = @sqlStr + ' WHERE  RowIndex BETWEEN ' + Convert(char,@start) + ' AND ' + Convert(char,@end)
-- 删除临时表
SELECT @sqlStr = @sqlStr + ' '+' DROP TABLE '+@tmpTable
EXEC (@sqlStr)
 
 
END
GO


/*
使用举例

EXEC dbo.sp_PageIndex @sqlSelect = ' fybh,brkh,brxm,zyh,fyph,cfbh,fydm,fymc,fysl,fyje,ssje,kdksmc,kdysmc,czksmc,czysmc,sfrq ', -- varchar(800)
    @sqlFrom = ' FROM  his_zy_zysfmx ', -- varchar(800)
    @countPerPage = 10000, -- int
    @toPage = 9 -- int

*/
